/*******************************************************************************

                          应用相关回调实现

*******************************************************************************/
#ifdef SUPPORT_EX_PREINCLUDE//不支持Preinlude時
  #include "Preinclude.h"
#endif

#include "IoCtrl.h"
#include "Color.h"

//---------------------------------得到开机底色-------------------------------
//开机时将用此色清屏，可用于准备入场动画的底色
Color_t TftDbi_cbGetInitBg(void)
{
  return DEFAULT_COLOR_BG;
}

/*****************************************************************************
                          BusSlvUsart回调函数
******************************************************************************/
#include "BusSlvUsart.h"
#include "ModbusCodec.h"
#include "cBootDcl.h"
//-----------------------------数据处理函数--------------------------------
//接收完数据后将调用此函数
//此函数内，应负责处理pBus->DataBuf缓冲区里的数据,并将处理结果返回
//返回-1表示错误;  0:数据正确，但不返回数据 
//其它:返回数据个数
signed short BusSlvUsart_cbDataPro(struct _BusSlvUsart *pBus,
                                    unsigned short RcvData,//接收数据长度
                                    unsigned char SlvAdr) //从机地址
{
  //Modbus协议时
  signed short Resume = ModbusCodec_Slv(pBus->DataBuf, RcvData, SlvAdr);
  if(Resume >= 0) return Resume;//处理完成
  //修改名称协议时(暂略)
  
  return 0;
}

/*******************************************************************************
                             ModbusCodec回调实现
*******************************************************************************/
extern unsigned char AutoAppTimer; //自动进BOOT倒计时

//-------------------------作为从机时编码函数--------------------------------
////返回-1表示错误;  0:数据正确，但不返回数据, 其它:返回数据个数(含地址)
signed short ModbusCodec_cbEncoder(unsigned char *pData,//功能码开始
                                    unsigned short RcvLen)//接收数据长度
{
  //if(RcvLen < 6) return -1;//异常->上层有保证
  unsigned char FunCode = *pData;
  if(FunCode == 67){//cBootDcl
    signed char Resume = cBootDcl_RcvPro(pData + 1, RcvLen - 1);
    if(Resume > 0) return Resume + 2; //加功能码与地址
  }
  else if(FunCode < 64){//不支持的标准功能码
    *pData |= 0x80; //返回错误
    return 2; //功能码与地址
  }
  return -1;//不支持的协议段
}

//--------------------通过回调初始化PicDecoderM2M 结构-------------------------
#ifdef SUPPORT_EPIC_JPG
#include "JpgDecoder.h"
#include "TftDrv.h"
void ePic_cbInitPicDecoderM2M(struct _PicDecoderM2M *pPicDecode)
{
  memset(pPicDecode, 0, sizeof(struct _PicDecoderM2M));
  JpgDecoderM2M_Init(pPicDecode, TftDrv_Buf, TFT_DRV_H_PIXEl, TFT_DRV_V_PIXEl); 
}
#endif //SUPPORT_EPIC_JPG

//----------------------ePic申请指定容量的解码缓存空间--------------------------
#ifdef APP_COMP_TEST
#ifndef PIC_DECODER_EPIC_BUF  //未用PicDecoder中的缓冲区作ePic缓存时
#include "PicDecoder.h"
//返回空间确保4字节对齐,NULL申请失败
void *ePic_cbGetDecodeSpace(unsigned long Size)
{
  return PicDecoder_cbMemMalloc(NULL, Size);
}
#endif
#endif











